a:9:{s:4:"name";s:15:"rss_live_search";s:7:"version";s:5:"0.2.2";s:6:"author";s:9:"Rob Sable";s:10:"author_uri";s:27:"http://www.wilshireone.com/";s:11:"description";s:12:"Live search.";s:4:"type";i:0;s:4:"help";s:3856:"
	<h1>Textpattern Live Search</h1>

	<p>This plugin is based on work done by:</p>

	<ul>
	<li>Markus Kniebes&#8217; <a href="http://kniebes.net/docs/textpattern/livesearch">LiveSearch Extension for Textpattern</a></li>
		<li><a href="http://blog4.bitflux.ch/wiki/LiveSearch">BitFlux LiveSearch Solution</a></li>
	</ul>

	<h2>How to Use This Plugin</h2>

	<ol>
	<li>Install and activate the plugin of course.</li>
		<li>Add a call to <code>&lt;txp:rss_live_search_js /&gt;</code> in the <code>&lt;head&gt;</code> section of your page.</li>
		<li>Add a call to <code>&lt;txp:rss_live_search /&gt;</code> wherever you want the search form to appear.  Add any of the optional attributes below.</li>
		<li>Include the <a href="#searchstyle">styles below</a> in your stylesheet.  Feel free to modify the styles as you see fit.</li>
	</ol>

	<h2>Attributes</h2>

	<p><strong>max</strong><br />
The maximum number of live search results returned.<br />
Default:  &#8220;20&#8221;<br />
Example: max=&#8221;10&#8221;</p>

	<p><strong>label</strong><br />
The label that appears next to the search input.<br />
Default:  &#8220;LiveSearch: &#8221;<br />
Example: label=&#8221;Type To Search: &#8221;</p>

	<p><strong>inputvalue</strong><br />
The text that appears in the search input field by default.<br />
Default:  &#8220;&#8221;<br />
Example: inputvalue=&#8221;search the archives&#8221;</p>

	<p><strong>inputsize</strong><br />
The size of the search input field.<br />
Default:  &#8220;20&#8221;<br />
Example: inputsize=&#8221;30&#8221;</p>

	<p><strong>showbutton</strong><br />
Determines whether a submit button appears on the live search form.<br />
Default:  &#8220;0&#8221;<br />
Example: showbutton=&#8221;1&#8221;</p>

	<p><strong>buttonval</strong><br />
The text that appears on the search form submit button.<br />
Default:  &#8220;Submit&#8221;<br />
Example: buttonval=&#8221;Go!&#8221;</p>

	<p><strong>searchto</strong><br />
By default the search form action will be your site home URL.  If you want to post your form to a subdirectory, indicate so here.  In the example below, the search would be posted to http://yoursite.com/search/?q=search+terms<br />
Default:  &#8220;&#8221;<br />
Example: searchto=&#8221;search&#8221;</p>

	<p><strong>autocompleteoff</strong><br />
Adds autocmplete=&#8221;off&#8221; to the search input field.  <strong>NOTE:</strong> This will not validate against the XHTML spec.<br />
Default:  &#8220;0&#8221;<br />
Example: autocompleteoff=&#8221;1&#8221;</p>

	<p><strong>form</strong><br />
The article form used to display search results.  Each search result will be rendered using the form and place inside a div as below.<br />
<code>&lt;div class="LSRow"&gt;</code>FORM CONTENT<code>&lt;/div&gt;</code><br />
Default:  &#8220;&#8221;<br />
Example: form=&#8221;live_search_article&#8221;</p>

	<p><strong>showdate</strong><br />
The article post date will be displayed in a span following the article title.<br />
Default:  &#8220;0&#8221;<br />
Example: showdate=&#8221;1&#8221;</p>

	<p><strong>excerpts</strong><br />
Determines whether search results excerpts below article titles as on a normal Textpattern search.<br />
Default:  &#8220;0&#8221;<br />
Example: excerpts=&#8221;1&#8221;</p>

	<p><strong>notfound</strong><br />
The message displayed when no search results are found.<br />
Default:  &#8220;No Results Found.&#8221;<br />
Example: notfound=&#8221;Nothing to see here.&#8221;</p>

	<h2 id="searchstyle">Example Styles</h2>

<code>
	<p>#LSResult  { position: absolute; background-color: #fff; width: 350px; }</p>
	<p>#LSShadow { padding: 5px; }</p>
	<p>#LSRes { background-color: #fff; }<br />
.LSRow { padding: 0 5px; }</p>
	<p>#LSHighlight  { background-color: #aaa; }</p>
	<p>#LSHeader { padding: 2px 2px 8px; }<br />
.lsDate { display: block; color: #555; }<br />
</code></p>



 ";s:4:"code";s:9843:"
/*
rss_live_search plugin for Textpattern
    <URL: http://www.wilshireone.com/textpattern-plugins/rss-live-search>
based on LiveSearch Extension for Textpattern, Markus Kniebes
		<URL: mailto:mk@kniebes.net>
based on BitFlux LiveSearch Solution
		<URL: http://blog4.bitflux.ch/wiki/LiveSearch>
*/

function rss_live_search_js() {
	return '<script type="text/javascript" src="'.hu.'?file=livesearch"></script>';
}

function rss_live_search($atts) {

  extract(lAtts(array(
    'max'        => 20,
    'excerpts' => '0',
    'label' => 'LiveSearch: ',
    'notfound' => 'No Results Found.',
    'searchto' => '',
    'autocompleteoff' => '0',
    'showdate' => '0',
    'form' => '',
    'inputvalue' => '',
    'inputsize' => '20',
    'showbutton' => '0',
    'buttonval' => 'Submit'
  ),$atts));

if (gps('ls') != "") {
    function livesearch( $q, $max, $doExc, $notfound, $showdate, $form) {
        global $prefs;
        extract($prefs);

				$s_filter = "";
				$rs = safe_column("name", "txp_section", "searchable != '1'");
				if ($rs) {
					foreach($rs as $name) $filters[] = "and Section != '$name'";
					$s_filter =  join(' ',$filters);
				}

        ob_start();
        header( "Content-Type: text/xml" );
        print '<?xml version=\'1.0\' encoding=\'utf-8\'  ?>';

				$where = "(Title rlike '$q' or Body rlike '$q') $s_filter and Status = 4 and Posted <=now() order by score desc limit $max";
        $rs = safe_rows(
            "*, ID as thisid, unix_timestamp(Posted) as posted, Title as title, match (Title,Body) against ('$q') as score",
            "textpattern", $where);

				if ($form) {
					if ($rs) {
            $o = array();
            $o[] = '<div id="LSRes">';
						foreach($rs as $a) {
							extract($a);
							populateArticleData($a);
							$article = fetch('Form', 'txp_form', 'name', $form);
							$o[] = '<div class="LSRow">'.parse($article).'</div>';
							unset($GLOBALS['thisarticle']);
						}
						$o[] = '</div>';
					} else {
        	$o[] = $notfound;
        	}
					print (is_array($o)) ? implode( "", $o ) : '';
   				exit;
				}

        if( $rs ) {
            $o = array();
            $o[] = '<div id="LSRes">';
            foreach($rs as $a) {
                extract($a);
								populateArticleData($a);
								$hurl = permlinkurl($a);

                if( $doExc ) {
                    $result = preg_replace("/>\s*</","> <",$Body_html);
                    preg_match_all("/\s.{0,50}".$q.".{0,50}\s/i",$result,$concat);
                    $concat = implode(" ... ",$concat[0]);
                    $concat = strip_tags($concat);
                    $concat = preg_replace('/^[^>]+>/U',"",$concat);
                    $concat = preg_replace("/($q)/i","<strong>$1</strong>",$concat);
                    $result_excerpt = ($concat) ? "... ".$concat." ..." : '';
                    $Title = '<strong>'.$Title.'</strong>';
                }
								$sd = ($showdate) ? '<span class="lsDate">'.strftime($archive_dateformat,$posted).'</span>' : '';
                $o[] = '<div class="LSRow"><a href="'.$hurl.'">'.$Title.'</a>'.$sd.'</div>';
                if( $doExc ) {
                    $o[] = '<br />';
                    $o[] = $result_excerpt;
                }
            }
            $o[] = '</div>';
        } else {
        	$o[] = $notfound;
        }
        print (is_array($o)) ? implode( "", $o ) : '';
    }

	exit(livesearch(gps('ls'), $max, $excerpts, $notfound, $showdate, $form));
}

$ac = ($autocompleteoff) ? 'autocomplete="off" ' : '';

if ($inputvalue != "") {
	$input = '
	<input id="livesearch" name="q" value="'.$inputvalue.'" onkeypress="liveSearchStart()"
	size="'.$inputsize.'" onblur="if (this.value == \'\') {this.value = \''.$inputvalue.'\';}"
	onfocus="if (this.value == \''.$inputvalue.'\') {this.value = \'\';}" '.$ac.' />';
} else {
	$input = '<input id="livesearch" name="q" onkeypress="liveSearchStart()" size="'.$inputsize.'" '.$ac.' />';
}

$sbtn = ($showbutton) ? '<input type="submit" id="livesearchsubmit" value="'.$buttonval.'" />' : '';

return '<form id="searchform" name="searchform" method="get" action="'.hu.$searchto.'" onsubmit="return liveSearchSubmit()">
				<label>'.$label.$input.'</label>'.$sbtn.'<br/>
				<div id="LSResult" style="display: none;"><div id="LSShadow"></div></div>
			</form>';
}

if (gps('file') == 'livesearch') {
global $pfr;
echo <<<EOF
/*
// +----------------------------------------------------------------------+
// | Copyright (c) 2004 Bitflux GmbH                                      |
// +----------------------------------------------------------------------+
// | Licensed under the Apache License, Version 2.0 (the "License");      |
// | you may not use this file except in compliance with the License.     |
// | You may obtain a copy of the License at                              |
// | http://www.apache.org/licenses/LICENSE-2.0                           |
// | Unless required by applicable law or agreed to in writing, software  |
// | distributed under the License is distributed on an "AS IS" BASIS,    |
// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or      |
// | implied. See the License for the specific language governing         |
// | permissions and limitations under the License.                       |
// +----------------------------------------------------------------------+
// | Author: Bitflux GmbH <devel@bitflux.ch>                              |
// +----------------------------------------------------------------------+
*/
var liveSearchReq = false;
var t = null;
var liveSearchLast = "";
var isIE = false;
// on !IE we only have to initialize it once
if (window.XMLHttpRequest) {
	liveSearchReq = new XMLHttpRequest();
	newMastheadReq = new XMLHttpRequest();
}
function liveSearchInit() {

	// Turns off autocomplete on the input element
	var searchInput = document.getElementById('livesearch');
	if( searchInput == null ) return;
	searchInput.setAttribute('autocomplete', 'off');

	if (navigator.userAgent.indexOf("Safari") > 0) {
		document.getElementById('livesearch').addEventListener("keydown",liveSearchKeyPress,false);
	} else if (navigator.product == "Gecko") {
		document.getElementById('livesearch').addEventListener("keypress",liveSearchKeyPress,false);
	} else {
		document.getElementById('livesearch').attachEvent('onkeydown',liveSearchKeyPress);
		isIE = true;
	}
}
function liveSearchKeyPress(event) {
	if (event.keyCode == 40 )
	//KEY DOWN
	{
		highlight = document.getElementById("LSHighlight");
		if (!highlight) {
			try {
			highlight = document.getElementById("LSRes").firstChild;
			} catch (exception) { }
		} else {
			highlight.removeAttribute("id");
			highlight = highlight.nextSibling;
		}
		if (highlight) {
			highlight.setAttribute("id","LSHighlight");
		}
		if (!isIE) { event.preventDefault(); }
	}
	//KEY UP
	else if (event.keyCode == 38 ) {
		highlight = document.getElementById("LSHighlight");
		if (!highlight) {
			try {
			highlight = document.getElementById("LSRes").lastChild;
			} catch (exception) {}
		}
		else {
			highlight.removeAttribute("id");
			highlight = highlight.previousSibling;
		}
		if (highlight) {
				highlight.setAttribute("id","LSHighlight");
		}
		if (!isIE) { event.preventDefault(); }
	}
	//ESC
	else if (event.keyCode == 27) {
		highlight = document.getElementById("LSHighlight");
		if (highlight) {
			highlight.removeAttribute("id");
		}
		document.getElementById("LSResult").style.display = "none";
		document.forms.searchform.q.value = '';
	}
	//ENTER
	else if (event.keyCode == 13) {
		liveSearchSubmit();
	}

}
function closeLiveSearch() {
	highlight = document.getElementById("LSHighlight");
	if (highlight) {
		highlight.removeAttribute("id");
	}
	document.getElementById("LSResult").style.display = "none";
	document.forms.searchform.q.value = '';
}
function liveSearchStart() {
	if (t) { window.clearTimeout(t); }
	t = window.setTimeout("liveSearchDoSearch()",200);
}
function liveSearchDoSearch() {
	if (liveSearchLast != document.forms.searchform.q.value) {
	if (liveSearchReq && liveSearchReq.readyState < 4) {
		liveSearchReq.abort();
	}
	if ( document.forms.searchform.q.value == "") {
		document.getElementById("LSResult").style.display = "none";
		highlight = document.getElementById("LSHighlight");
		if (highlight) {
			highlight.removeAttribute("id");
		}
		return false;
	}
	if (window.XMLHttpRequest) {
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		liveSearchReq = new ActiveXObject("Microsoft.XMLHTTP");
	}
	liveSearchReq.onreadystatechange= liveSearchProcessReqChange;
	liveSearchReq.open("GET", "
EOF;

echo $pfr;

echo <<<EOF
?ls=" + document.forms.searchform.q.value);
	liveSearchLast = document.forms.searchform.q.value;
	liveSearchReq.send(null);
	}
}
function liveSearchProcessReqChange() {
	if (liveSearchReq.readyState == 4) {
		var res = document.getElementById("LSResult");
		res.style.display = "block";
		res.firstChild.innerHTML = '<div id="LSHeader"><div style="float:left;">use arrow keys &amp; enter</div><div style="float:right;"><a href="javascript://" title="Close results" onclick="closeLiveSearch()">close (esc)</a></div><br /></div>'+liveSearchReq.responseText;//;
	}
}
function liveSearchSubmit() {
	var highlight = document.getElementById("LSHighlight");
	if (highlight && highlight.firstChild) {
		window.location = highlight.firstChild.getAttribute("href");
		return false;
	} else {
		var searchInput = document.getElementById('searchform');
	  searchInput.submit();
		return false;
	}
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(function() {
  liveSearchInit();
});
EOF;
exit;
}
";s:3:"md5";s:32:"92b116e5bdc500189f36ba404e652ea1";}